c++ - Visual C++ volatile
全部标签__I、__O、__IO是什么意思?这是ST库里面的宏定义,定义如下:#define__Ivolatileconst/*!#define__Ovolatile/*!/#define__IOvolatile/!显然,这三个宏定义都是用来替换成volatile和const的,所以我们先要了解这两个关键字的作用:1、volatile简单的说,就是不让编译器进行优化,即每次读取或者修改值的时候,都必须重新从内存或者寄存器中读取或者修改。volatile的基本应用场合:1、中断服务程序中修改的供其它程序检测的变量需要加volatile;2、多任务环境下各任务间共享的标志应该加volatile;3、存储器
好吧,假设我有一堆变量,其中一个声明为volatile:inta;intb;intc;volatileintv;如果一个线程写入所有四个变量(最后写入v),而另一个线程读取所有四个变量(首先从v读取),则第二个线程执行线程看到第一个线程写入a、b和c的值,即使它们本身没有声明为volatile?或者它是否可能看到过时的值?由于似乎有些困惑:我不是故意尝试做一些不安全的事情。我只是想了解Java内存模型和volatile关键字的语义。纯粹的好奇心。 最佳答案 我将谈谈我认为您可能真正在探索的东西——搭载同步。您尝试使用的技术看起来涉及
摘自《Java并发实践》第26页:仅当满足以下所有条件时,您才能使用volatile变量:对变量的写入不取决于其当前值,或者您可以确保只有一个线程永远更新该值;该变量不参与与其他状态变量的不变量;和在访问变量时,不需要出于任何其他原因进行锁定。如何理解“使用volatile关键字时变量不与其他状态变量参与不变量”? 最佳答案 “不变”的简单定义:在对象的生命周期内始终为真的条件。Volatilevariablesdonotsharetheatomicityfeaturesofsynchronizedblocks.这就是为什么您不能在
我需要对存储在分布式FS上的相当大的文件进行哈希处理。我能够以比整个文件更好的性能处理文件的各个部分,因此我希望能够计算各个部分的哈希值,然后对其求和。我正在考虑将CRC64作为哈希算法,但我不知道如何使用其理论上的“线性函数”属性,因此我可以对文件的各个部分求和CRC。有什么推荐吗?我在这里遗漏了什么吗?我查看CRC64的附加说明:我可以控制文件block,但由于应用程序的性质,它们需要具有不同的大小(最多1个字节,不可能有任何固定block)。我知道CRC32实现(zlib),它包括对部分CRC求和的方法,但我想要更广泛的东西。8个字节对我来说很不错。我知道CRC非常快。我想从中获
我读过这个answer最后写了以下内容:Anythingthatyoucanwithvolatilecanbedonewithsynchronized,butnotviceversa.不清楚。JLS8.3.1.4定义可变字段如下:Afieldmaybedeclaredvolatile,inwhichcasetheJavaMemoryModelensuresthatallthreadsseeaconsistentvalueforthevariable(§17.4).因此,volatile字段与内存可见性有关。另外,就我引用的答案而言,读取和写入volatile字段是同步的。同步反过来保证
文章目录1、volatile的内存语义2、内存屏障2、happens-before之volatile变量规则4、Demo1、volatile的内存语义内存可见性volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。为了能比较清晰彻底的理解volatile,我们一步一步来分析。首先来看看如下代码publicclassvolatileDemo1{sta
可能类似的问题:DoyoueverusethevolatilekeywordinJava?今天我在调试我的游戏;它有一个非常困难的线程问题,每隔几分钟就会出现一次,但很难重现。所以首先我将synchronized关键字添加到我的每个方法中。那没有用。然后我将volatile关键字添加到每个字段。问题似乎自行解决。经过一些实验,我发现负责的字段是一个GameState对象,它跟踪我的游戏的当前状态,可以是正在玩也可以是忙。忙碌时,游戏会忽略用户输入。我拥有的是一个不断更改state变量的线程,而Event线程读取state变量。但是,一个线程更改变量后,另一个线程需要几秒钟才能识别更改,
...没有额外的同步?下面的Tree类旨在被多个线程访问(它是一个单例但不是通过枚举实现的)classTree{privatevolatileNoderoot;Tree(){root=newNode();//thethreadsarespawned_after_thetreeisconstructed}privatefinalclassNode{shortnumOfKeys;}}numOfKeys字段的更新是否对读取器线程可见而无需任何显式同步(请注意,读取器和写入器都必须获取ReentrantReadWriteLock的实例-每个节点都具有相同的实例-但禁止那)?如果不是,使numO
我有一个包含volatileHashMap的缓存类存储缓存项。我很好奇更改volatileHashMap会产生什么后果至ConcurrentHashMap?我会获得性能提升吗?此缓存是只读缓存。最好的选择是什么?只是哈希表?缓存按时间间隔填充。 最佳答案 首先,您似乎不了解volatile关键字的作用。它确保如果声明为volatile的变量持有的引用值发生变化,其他线程将看到它而不是拥有缓存副本。它与访问HashMap时的线程安全无关鉴于此,以及您说HashMap是只读的事实......您当然不需要使用任何提供线程安全的东西,包括C
这似乎是一个非常基本的问题,但我找不到明确的确认。假设我有一个正确同步的类:publicclassSyncClass{privateintfield;publicsynchronizedvoiddoSomething(){field=field*2;}publicsynchronizedvoiddoSomethingElse(){field=field*3;}}如果我需要对那个类的实例有一个引用,并在线程之间共享,我仍然需要声明那个实例是volatile或final,我说得对吗?如:publicclassMainClass{//previouslyOuterClasspublicsta